package minesweeper;

/**
 * 表示雷区中的一个位置。一个位置由行和列索引对组成，都是从零开始的。
 * 这个类的实例是不可变的。
 */
public class Position
{
	private final int aRowIndex;
	private final int aColumnIndex;

	/**
	 * 创建一个新的位置。
	 *
	 * @param pRow 此位置的从零开始的行索引。
	 * @param pColumn 此位置的从零开始的列索引。
	 * @pre pRow >= 0 && pColumn >= 0;
	 */
	public Position(int pRow, int pColumn)
	{
		assert pRow >= 0 && pColumn >= 0;
		aRowIndex = pRow;
		aColumnIndex = pColumn;
	}

	/**
	 * @return 返回此位置的行索引。
	 */
	public int getRow()
	{
		return aRowIndex;
	}

	/**
	 * @return 返回此位置的列索引。
	 */
	public int getColumn()
	{
		return aColumnIndex;
	}

	@Override
	public int hashCode()
	{
		final int prime = 31;
		int result = 1;
		result = prime * result + aColumnIndex;
		result = prime * result + aRowIndex;
		return result;
	}

	@Override
	public boolean equals(Object pObject)
	{
		if(this == pObject)
		{
			return true;
		}
		if(pObject == null)
		{
			return false;
		}
		if(getClass() != pObject.getClass())
		{
			return false;
		}
		Position other = (Position) pObject;
		return aColumnIndex == other.aColumnIndex && aRowIndex == other.aRowIndex;
	}

	@Override
	public String toString()
	{
		return String.format("(r=%d, c=%d)", aRowIndex, aColumnIndex);
	}
}